package org.wangnian.demo02_config_file;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;
import org.wangnian.demo02_config_file.config.Config2;
import org.wangnian.demo02_config_file.config.Config3;
import org.wangnian.demo02_config_file.config.Config4;
import org.wangnian.demo02_config_file.config.CustomPropertySourceFactory;

import java.util.LinkedHashMap;

@SpringBootApplication
// 虽然使用 @PropertySource 似乎是在环境中加载自定义资源的一种方便而简单的方法，但我们不推荐使用它，
// 因为 SpringBoot 在刷新应用程序上下文之前就准备好了环境，而 @PropertySource 是在刷新应用程序上下文之后才加载。
// 使用 @PropertySource 定义的任何键都加载得太晚，无法对自动配置产生任何影响。
//
// 因此，如果某些参数是启动项变量，建议将其定义在 application.properties或application.yml文件里面，这样就不会有问题！
// 或者，采用【自定义环境处理类】来实现配置文件的加载！
@PropertySource(value = {"classpath:bussiness.properties","classpath:test.properties"},encoding = "UTF-8")
// 默认 @PropertySource 不支持加载 .yml 文件，自定义 CustomPropertySourceFactory 类用来加载 .yml 文件
@PropertySource(value = {"classpath:blog.yml"},encoding = "UTF-8",factory = CustomPropertySourceFactory.class)
public class Demo02ConfigFileApplication implements CommandLineRunner {

    // 使用 @value 注解注入配置，通常情况下有个要求就是，注解里面的变量，必须在 application.properties 文件里面事先定义好，否则启动报错！
    // 当然，如果我们不想让它抱错，我们可以给它一个缺省值 default,如下
    @Value("${config.name:default}")
    private String name;
    @Autowired
    private Config2 config2;
    @Autowired
    private Config3 config3;
    @Autowired
    private Config4 config4;
    @Value(value = "${test.a1}")
    private String a1;
    @Value(value = "${bussiness.b1}")
    private String b1;
    @Value(value = "${blog.username}")
    private String username;


    public static void main(String[] args) {
        SpringApplication.run(Demo02ConfigFileApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println("name = " + name);
        System.out.println("config2 = " + config2);
        System.out.println("config3 = " + config3);
        System.out.println("config4 = " + config4);
        System.out.println("a1 = " + a1);
        System.out.println("b1 = " + b1);
        System.out.println("username = " + username);
    }

}
